home *** CD-ROM | disk | FTP | other *** search
/ Plug-In Power Pack for Netscape Communicator / Plug-In Power Pack for Netscape Communicator.iso / plugins / dataviews / dvtools / demos / telecomdemo / move_win.c < prev    next >
C/C++ Source or Header  |  1997-05-08  |  5KB  |  191 lines

  1. #ifndef lint
  2. static char SccsId[]= "@(#)move_win.c    V1.6    3/17/95";
  3. #endif
  4.  
  5. /*
  6.  |    File name: move_win.c
  7.  |========================================================================
  8.  |
  9.  |    Copyright (c) 1990 -- V.I. Corporation
  10.  |
  11.  |========================================================================
  12.  */
  13.  
  14. #include "simulate.h"
  15. #include "tlc_fundecl.h"
  16.  
  17.  
  18. /***************** Begin Function Declarations *************/
  19. LOCAL  void move_window V_P_((OBJECT location, DV_POINT *screen_lim, RECTANGLE *curr_pos, RECTANGLE *rel));
  20. /***************** End Function Declarations *************/
  21.  
  22. /*
  23.  *   Global and local function declarations.
  24.  */
  25. LOCAL VOID move_window ();
  26.  
  27. /*
  28.  *   MoveDrawport -- move a rectangle withing the screen.  Take a rectangle
  29.  *     that describes the position of a drawport and a location object the is
  30.  *     the current position of the cursor, and allow the user to move an
  31.  *     outline of the drawport until he releases the button he's holding.
  32.  */
  33. /* ARGSUSED */
  34. void 
  35. MoveDrawport (screen, curr_pos, orig_location)
  36.      OBJECT screen;
  37.      RECTANGLE *curr_pos;
  38.      OBJECT orig_location;
  39. {
  40.   DV_POINT *ptr, *screen_lim;
  41.   RECTANGLE rel;
  42.   INT indx;
  43.   OBJECT location;
  44.   DV_BOOL done = NO;
  45.  
  46.   /*
  47.    *   Get the current position of the cursor and compute its position
  48.    *     relative to the corners of the rectangle.
  49.    */
  50.   ptr = VOloScpGet (orig_location);
  51.   rel.ll.x = ptr->x - curr_pos->ll.x;
  52.   rel.ll.y = ptr->y - curr_pos->ll.y;
  53.   rel.ur.x = curr_pos->ur.x - ptr->x;
  54.   rel.ur.y = curr_pos->ur.y - ptr->y;
  55.   screen_lim = VOscSize ();
  56.  
  57.   /*
  58.    *   Use a medium gray as the outline color of the rectangle and set the
  59.    *     drawing mode to XOR.
  60.    */
  61.   (VOID) GRrgbtoindex (128, 128, 128, &indx);
  62.   (VOID) GRcolor (indx);
  63.   (VOID) GRset (V_DRAW_FUNCTION, V_XOR, V_END_OF_LIST);
  64.   (VOID) GRrectangle (&curr_pos->ll, &curr_pos->ur);
  65.   (VOID) VOscWinEventMask ((ULONG) V_ADD_TO_MASK |
  66.                            V_MOTIONNOTIFY |
  67.                            V_BUTTONRELEASE |
  68.                            V_LEAVENOTIFY,
  69.                            0L);
  70.  
  71.   /*
  72.    *   Continue polling the cursor, moving the outline of the rectangle as
  73.    *     necessary, until the button is released or the cursor leaves the
  74.    *     window.
  75.    */
  76.   while (!done)
  77.     {
  78.       location = VOscWinEventPoll ((INT) V_WAIT);
  79.       switch (VOloType (location))
  80.         {
  81.         case V_MOTIONNOTIFY:
  82.           move_window (location, screen_lim, curr_pos, &rel);
  83.           break;
  84.         case V_BUTTONRELEASE:
  85.           move_window (location, screen_lim, curr_pos, &rel);
  86.           done = YES;
  87.           break;
  88.         case V_LEAVENOTIFY:
  89.           done = YES;
  90.           break;
  91.         default:
  92.           break;
  93.         }
  94.     }
  95.  
  96.   /*
  97.    *   Erase the last instance of the outline and restore the drawing mode.
  98.    */
  99.   (VOID) GRrectangle (&curr_pos->ll, &curr_pos->ur);
  100.   (VOID) GRset (V_DRAW_FUNCTION, V_COPY, V_END_OF_LIST);
  101. }
  102.  
  103.  
  104. /*
  105.  *   move_window -- use the new location object to see if the outline
  106.  *     of the rectangle needs to be moved.
  107.  */
  108. LOCAL void 
  109. move_window (location, screen_lim, curr_pos, rel)
  110.      OBJECT location;
  111.      DV_POINT *screen_lim;
  112.      RECTANGLE *curr_pos;
  113.      RECTANGLE *rel;
  114. {
  115.   DV_POINT *ptr;
  116.   DV_BOOL change = NO;
  117.   RECTANGLE new_pos;
  118.  
  119.   /*
  120.    *   Get the screen position of the cursor, and check to see if the
  121.    *     the left and right sides of the box are within the limits of
  122.    *     the screen.
  123.    */
  124.   ptr = VOloScpGet (location);
  125.   if (ptr->x - rel->ll.x > 0 && ptr->x + rel->ur.x < screen_lim->x)
  126.     {
  127.       new_pos.ll.x = ptr->x - rel->ll.x;
  128.       new_pos.ur.x = ptr->x + rel->ur.x;
  129.       change = YES;
  130.     }
  131.  
  132.   /*
  133.    *   If one of the sides is off the screen, then determine which side it
  134.    *     is and adjust it so that it's just at the screen limit.
  135.    */
  136.   else if (ptr->x - rel->ll.x <= 0)
  137.     {
  138.       new_pos.ll.x = 0;
  139.       new_pos.ur.x = rel->ll.x + rel->ur.x;
  140.     }
  141.   else
  142.     {
  143.       new_pos.ur.x = screen_lim->x;
  144.       new_pos.ll.x = screen_lim->x - rel->ur.x - rel->ll.x;
  145.     }
  146.  
  147.   /*
  148.    *   Do the same limit checking for the top and bottom of the box.
  149.    */
  150.   if (ptr->y - rel->ll.y > 0 && ptr->y + rel->ur.y < screen_lim->y)
  151.     {
  152.       new_pos.ll.y = ptr->y - rel->ll.y;
  153.       new_pos.ur.y = ptr->y + rel->ur.y;
  154.       change = YES;
  155.     }
  156.   else if (ptr->y - rel->ll.y <= 0)
  157.     {
  158.       new_pos.ll.y = 0;
  159.       new_pos.ur.y = rel->ll.y + rel->ur.y;
  160.     }
  161.   else
  162.     {
  163.       new_pos.ur.y = screen_lim->y;
  164.       new_pos.ll.y = screen_lim->y - rel->ur.y - rel->ll.y;
  165.     }
  166.  
  167.   /*
  168.    *   Check to see if the box has moved at all and if it has then
  169.    *     erase the old image of the box and draw a new one at the new
  170.    *     position.
  171.    */
  172.   if (new_pos.ll.x != curr_pos->ll.x)
  173.     change = YES;
  174.   if (new_pos.ll.y != curr_pos->ll.y)
  175.     change = YES;
  176.   if (new_pos.ur.x != curr_pos->ur.x)
  177.     change = YES;
  178.   if (new_pos.ur.y != curr_pos->ur.y)
  179.     change = YES;
  180.  
  181.   if (change)
  182.     {
  183.       (VOID) GRrectangle (&curr_pos->ll, &curr_pos->ur);
  184.       (VOID) GRrectangle (&new_pos.ll, &new_pos.ur);
  185.       curr_pos->ll.x = new_pos.ll.x;
  186.       curr_pos->ll.y = new_pos.ll.y;
  187.       curr_pos->ur.x = new_pos.ur.x;
  188.       curr_pos->ur.y = new_pos.ur.y;
  189.     }
  190. }
  191.